package references

import (
	"hi-jvm/instructions/base"
	"hi-jvm/rtda"
)

/*
判断对象是否是某个类的实例， 并把结果推入操作数栈
 */
// Determine if object is of given type
type INSTANCE_OF struct{ base.Index16Instruction }

/*
instanceof指令需要两个操作数。
第一个操作数是uint16索引，
	从方法的字节码中获取，
	通过这个索引可以从当前类的运行时常量池中找到一个类符号引用。
第二个操作数是对象引用， 从操作数栈中弹出
 */
func (self *INSTANCE_OF) Execute(frame *rtda.Frame) {
	stack := frame.OperandStack
	ref := stack.PopRef()
	if ref == nil {
		stack.PushInt(0)
		return
	}

	class := frame.GetClass(self.Index)
	if ref.IsInstanceOf(class) {
		stack.PushInt(1)
	} else {
		stack.PushInt(0)
	}
}

